#include <logbase.h>
#include <inttypes.h>

// inttypes.h 定义了通用类型：int8_t，int16_t， int32_t， int64_t。便于移植32位与64位系统。c99标准。
//                地址(假定)	    变量名	   空间大小	        内存内容	 说明
// int a = 123;	  0x10。通过&a获得	 a	       4	          123	      操作a就是操作地址0x10-0x13这4个字节的空间
// int *b = a;	  0x14。通过&b获得	 b	       8(64位系统)	   0x10	       操作b就是操作地址0x14-0x1b这8个字节的空间,操作*b就是操作a的空间

// const char *buffer;常量指针（保存常量的指针，指针buffer可修改，指针buffer内容不可修改）。
// char * const buffer;指针常量（保存指针的常量，指针buffer不可变，指针buffer内容可修改）
// char buffer[10];数组是指针常量。buffer不能修改，但其内容buffer[0]可以修改。

int main(int argc, char **argv)
{
    {
        int8_t tmpi8 = -1;
        // 本身%d需要int类型，%x也需要int类型。但编译器没有报错，说明编译器已经做了优化，将变量tmpi8强制转为了int类型！！！
        // AI回答：在可变参数中，小整数类型会被提升为int，float会被提升为double。
        // 51单片机，可能是编译器太老，%d不能正确打印int8_t类型，需要自己强制转换:
        // printf("%d, %x\n", (int)tmpi8, (int)tmpi8);
        logdebugc("%d, %x", tmpi8, tmpi8);
        int tmpi32 = tmpi8;
        logdebugc("%d, %x", tmpi32, tmpi32);
        uint8_t tmpu8 = tmpi8;
        logdebugc("%d, %x", tmpu8, tmpu8);
        tmpi32 = tmpu8;
        logdebugc("%d, %x", tmpi32, tmpi32);
    }
    {
        int8_t tmpi8 = -1;
        logdebugc("0x%02x", tmpi8);
        logdebugc("0x%02x", (uint8_t)tmpi8);
    }
    return 1;
}



